package com.zb.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zb.entity.ZjAdmWxTemplate;
import com.zb.entity.dto.WxTemplateDto;
import com.zb.entity.dto.WxTemplateInfoDto;
import com.zb.entity.dto.WxTemplateSelectDto;
import com.zb.mapper.ZjAdmWxTemplateMapper;
import com.zb.service.ZjAdmWxTemplateContentService;
import com.zb.service.ZjAdmWxTemplateService;
import com.zb.utils.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 后台微信消息模板库表 服务实现类
 * </p>
 *
 * @author WEN
 * @since 2023-07-11
 */
@Service
public class ZjAdmWxTemplateServiceImpl extends ServiceImpl<ZjAdmWxTemplateMapper, ZjAdmWxTemplate> implements ZjAdmWxTemplateService {
    @Autowired
    private ZjAdmWxTemplateMapper wxTemplateMapper;
    @Autowired
    private ZjAdmWxTemplateContentService templateContentService;

    // 新增或修改微信消息模板
    @Override
    @Transactional
    public void save(WxTemplateDto wxTemplateDto) {
        Assert.isTrue(null == wxTemplateMapper.existByTemplateIdShort(wxTemplateDto.getId(), wxTemplateDto.getTemplateIdShort()),
        "微信模板编号已存在，不可重复添加或更改", wxTemplateDto.getTemplateIdShort());

        ZjAdmWxTemplate template = WxTemplateDto.dtoToBean(wxTemplateDto);
        if (null != template.getId()) {
            this.updateById(template);
            templateContentService.save(template.getId(), wxTemplateDto.getContent(), wxTemplateDto.getContentIds());
            return;
        }
        template.setId(IdWorker.getId());
        template.setDisabled(false);
        this.save(template);
        templateContentService.save(template.getId(), wxTemplateDto.getContent(), null);
    }

    // 微信消息模板列表
    @Override
    public Map<String, Object> getList(WxTemplateSelectDto templateSelectDto) {
        QueryWrapper<ZjAdmWxTemplate> wrapper = new QueryWrapper ();
        wrapper.orderByDesc("gmt_update");
        if (StringUtils.isNotBlank(templateSelectDto.getTemplateIdShort())) {
            wrapper.like("template_id_short", templateSelectDto.getTemplateIdShort());
        }
        if (StringUtils.isNotBlank(templateSelectDto.getName())) {
            wrapper.like("name", templateSelectDto.getName());
        }
        if (StringUtils.isNotBlank(templateSelectDto.getModule())) {
            wrapper.like("module", templateSelectDto.getModule());
        }
        if (StringUtils.isNotBlank(templateSelectDto.getRole())) {
            wrapper.like("role", templateSelectDto.getRole());
        }
        if (StringUtils.isNotBlank(templateSelectDto.getContent())){
            wrapper.in("id", templateContentService.getAdmWxTemplateIdByName(templateSelectDto.getContent()));
        }
        PageUtil.setPageLimit(templateSelectDto);
        Page<ZjAdmWxTemplate> page = this.page(new Page<>(templateSelectDto.getPage(), templateSelectDto.getLimit()), wrapper);

        List<WxTemplateInfoDto> templateInfoDtoList = new ArrayList<>();
        page.getRecords().forEach(t -> templateInfoDtoList.add(WxTemplateInfoDto.beanToInfo(t, templateContentService.getByAdmWxTemplateId(t.getId()))));
        return PageUtil.pageList(page.getCurrent(), page.getSize(), page.getTotal(), templateInfoDtoList);
    }

    // 根据模板ID获取详情
    @Override
    public WxTemplateInfoDto getInfoById(Long id) {
        ZjAdmWxTemplate template = this.getById(id);
        return WxTemplateInfoDto.beanToInfo(template, templateContentService.getByAdmWxTemplateId(id));
    }

    // 批量禁用或启用微信模板
    @Override
    public void batchDisabled(List<Long> idList, boolean disable) {
        wxTemplateMapper.updateBatchDisabledById(idList, disable);
    }
}
